# 2020/09/20 面试总结

在公司呆久了,出去面试见识见识世面

一共面了两家公司,分别讲讲。

# 上午

# 斐波那契

# 方法一:普通递归

function fibonacci(n) {
    if ([1, 2].includes(n)) return 1;
    return fibonacci(n - 2) + fibonacci(n - 1);
}

f: 1901.197998046875 ms

缺点:存在重复计算,容易爆栈

# 方法二:改进递归,作为函数参数

function fibonacci(n) {
	function fib(n, v1, v2) {
		if (n === 1) {
			return v1
		} else if (n === 2) {
			return v2
		} else {
			return fib(n - 1, v2, v1 + v2)
		}
	} 
	return fib(n, 1, 1)
}

f: 7.71484375 ms

# 方法三:改进递归,用数组记录

function fibonacci(n) {
	let memo = [0, 1]
	function fib(n) {
		if (memo[n] === undefined) {
			memo[n] = fib(n - 1) + fib(n - 2)
		}
		return memo[n]
	}
	return fib(n)
}

f: 14.156005859375 ms

# 方法四: for循环

function fibonacci(n) {
	let n1 = 1, n2 = 1
	for (let i = 2; i < n; i++) {
		[n1, n2] = [n2, n1 + n2]
	}
	return n2
}

f: 5.817138671875 ms

# 运行耗时

let x = 1
console.time('f') 
while (x < 10000) {
    fibonacci(20)
    x++
}
console.timeEnd('f') 

普通递归>改进递归>for循环

# 左右布局

# float+margin

.left {
    float: left;
    width: 200px;
    height: 100%;
    background-color: red;
}
.right {
    margin-left: 200px;
    background-color: blue;
}

# float + overflow:hidden

利用overflow:hidden形成BFC,因为BFC不会与float box重叠。

.left {
    float: left;
    width: 200px;
    height: 100%;
    background-color: red;
}
.right {
    overflow:hidden;
    background-color: blue;
}
12345678910

# CSS3 float + calc

.left {
    float: left;
    width: 200px;
    height: 100%;
    background-color: red;
}
.right {
    float: left;
    width: calc(100% - 200px);
    height: 100%;
    background-color: blue;
}
123456789101112

# 弹性布局

.parent {
	display: flex;
}
.left {
    width: 200px;
    height: 100%;
    background-color: red;
}
.right {
    display: flex;
    flex: 1;
    height: 100%;
    background-color: blue;
}

# 定位

当然,使用absolute定位也是可以的,通过left调整位置就可以了。

# 表单设计

不知道怎么写,写了个vue的常规操作

# 从输入Url到显示

常规操作

http需详细了解

# 有效括号

leetcode常规操作

# 两个数组求是否是子集

# vue 父子组件的生命周期顺序

1. 加载渲染过程

  • 同步引入时生命周期顺序为: 父组件的beforeCreate、created、beforeMount --> 所有子组件的beforeCreate、created、beforeMount --> 所有子组件的mounted --> 父组件的mounted 总结:父组件先创建,然后子组件创建;子组件先挂载,然后父组件挂载 若有孙组件呢? 父组件先beforeCreate => created => beforeMount , 然后子组件开始beforeCreate => created => beforeMount ,然后孙组件beforeCreate => created => beforeMount => mounted,孙组件挂载完成了,子组件mounted,父组件再mounted

  • 异步引入时生命周期顺序为: 父组件的beforeCreate、created、beforeMount、mounted --> 子组件的beforeCreate、created、beforeMount、mounted

    总结:父组件创建,父组件挂载;子组件创建,子组件挂载。

2. 子组件更新过程 父beforeUpdate->子beforeUpdate->子updated->父updated

3.父组件更新过程 父beforeUpdate->父updated

4.销毁过程 父beforeDestroy->子beforeDestroy->子destroyed->父destroyed

# 下午

问的很简单,没问什么技术问题,考了两道逻辑题,一道都没答出来。。。

  1. 5L水,3L水,求4L水
  2. 黑帽子白帽子,求黑帽子